/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.ipartek.formacion.gestformwww.modelo.clases;

import com.ipartek.formacion.gestformwww.controlador.Verificador;
import com.ipartek.formacion.gestformwww.modelo.beans.*;
import com.ipartek.formacion.gestformwww.modelo.beans.excepciones.GestorFormacionExcepcion;
import com.ipartek.formacion.gestformwww.modelo.interfaces.*;
import java.sql.*;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Iratxe-Jon
 */
public class SQLServerCandidatoDAO implements ICandidatoDAO{
     private static ResourceBundle rb;

      public SQLServerCandidatoDAO() {
        rb = ResourceBundle.getBundle("com.ipartek.formacion.gestformwww.controlador.excepciones");
    }


     /**
     * Método que asigna candidatos a una convovcatoria.
     * @author Iratxe-Jon
     * @param ArrayList<Candidatos>: Lista de candidatos.
     * @param conId: Identificador de la convocatoria.
     */
    public void asignarCandidatoAConvocatoria(ArrayList candidatos, int conId) throws GestorFormacionExcepcion {
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = null;
            stmt = conexion.prepareStatement("INSERT INTO candconv (CanId, ConId, EstId) VALUES(?, ?, ?)");
            for (Integer canId : (ArrayList<Integer>) candidatos) {
                stmt.setInt(1, canId);
                stmt.setInt(2, conId);
                // Fran: Añado el EstId al ser campo obligatorio con el valor por defecto: Sin Confirmar = 1
                stmt.setInt(3, 1);
                stmt.executeUpdate();
            }
            stmt.close();
        } catch (SQLException ex) {
            if (ex.getErrorCode() == 2627) {
                 Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
                throw new GestorFormacionExcepcion(rb.getString("ya-existe"));
            } else {
                 Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }
    }
 /**
     * Crea un candidato nuevo en la base de datos,  comprobando que ya exista anteriormente.
     * @author Iratxe-Jon
     * @param candidato: Contiene los datos del Candidato.
     * @return Devuelve el identificador del candidato. En el caso de que no se cree, devuelve -1.
     */
    /*public void crearCandidato(Candidato candidato) throws GestorFormacionExcepcion {
        Connection con = null;
        SentenciaNula stmt = null;
        ResultSet rs = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement sql = con.prepareStatement("SELECT CanId, CanNIF, CanNSS, CanTlf1, CanTlf2, CanMail, CanDir, CanLocalidad, CanFechNac, CanNom, CanApe1, CanApe2, CanObserv, EmpId,ProId,CanActivo FROM CANDIDATO WHERE UPPER(CanNIF)=?");
            sql.setString(1, candidato.getCanNif().toUpperCase());
            rs=sql.executeQuery();

            if(!rs.next()){
                stmt = new SentenciaNula(con, "INSERT INTO CANDIDATO (CanNIF, CanNSS, CanTlf1, CanTlf2, CanMail, CanDir, CanLocalidad, CanFechNac, CanNom, CanApe1, CanApe2, CanObserv, EmpId,ProId,CanActivo)VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
                //stmt.setInt(1, candidato.getCanId());
                stmt.setString(1, candidato.getCanNif());
                stmt.setString(2, candidato.getCanNss());
                stmt.setString(3, candidato.getCanTlf1());
                stmt.setString(4, candidato.getCanTlf2());
                stmt.setString(5,candidato.getCanMail());
                stmt.setString(6, candidato.getCanDir());
                stmt.setString(7, candidato.getCanLocalidad());
                stmt.setTimestamp(8, candidato.getCanFechaNac());
                stmt.setString(9, candidato.getCanNom());
                stmt.setString(10, candidato.getCanApe1());
                stmt.setString(11, candidato.getCanApe2());
                stmt.setString(12, candidato.getCanObserv());
                stmt.setInt(13, candidato.getEmpId());
                stmt.setInt(14, candidato.getProId());
                stmt.setBoolean(15, candidato.isCanActivo());
                stmt.executeUpdate();
            }else{
                GestorFormacionExcepcion ex = new GestorFormacionExcepcion(rb.getString("existe-nif"));
                candidato=this.instanciarCandidato(rs);
                ex.setObjetoExcepcion(candidato);
                throw ex;
            }
            sql.close();
            stmt.close();
        } catch (SQLException ex) {
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));

        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }*/

    /**
     * Crea un candidato nuevo en la base de datos,  comprobando que ya exista anteriormente.
     * @author Iratxe-Jon
     * @param candidato: Contiene los datos del Candidato.
     * @return Devuelve el identificador del candidato. En el caso de que no se cree, devuelve -1.
     */
    public int crearCandidato(Candidato candidato) throws GestorFormacionExcepcion {
        Connection con = null;
        SentenciaNula stmt = null;
        ResultSet rs = null;
        int activo = 0;
        int id = -1;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement sql = con.prepareStatement("SELECT CanId, CanNIF, CanNSS, CanTlf1, CanTlf2, CanMail, CanDir, CanLocalidad, CanFechNac, CanNom, CanApe1, CanApe2, CanObserv, EmpId,ProId,CanActivo FROM CANDIDATO WHERE UPPER(CanNIF)=?");
            sql.setString(1, candidato.getCanNif().toUpperCase());
            rs=sql.executeQuery();

            if(!rs.next()){
                stmt = new SentenciaNula(con, "INSERT INTO CANDIDATO (CanNIF, CanNSS, CanTlf1, CanTlf2, CanMail, CanDir, CanLocalidad, CanFechNac, CanNom, CanApe1, CanApe2, CanObserv, EmpId,ProId,CanActivo)VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", Statement.RETURN_GENERATED_KEYS);
                //stmt.setInt(1, candidato.getCanId());
                stmt.setString(1, candidato.getCanNif());
                stmt.setString(2, candidato.getCanNss());
                stmt.setString(3, candidato.getCanTlf1());
                stmt.setString(4, candidato.getCanTlf2());
                stmt.setString(5,candidato.getCanMail().trim());
                stmt.setString(6, candidato.getCanDir());
                stmt.setString(7, candidato.getCanLocalidad());
                stmt.setTimestamp(8, candidato.getCanFechaNac());
                stmt.setString(9, candidato.getCanNom());
                stmt.setString(10, candidato.getCanApe1());
                stmt.setString(11, candidato.getCanApe2());
                stmt.setString(12, candidato.getCanObserv());
                stmt.setInt(13, candidato.getEmpId());
                stmt.setInt(14, candidato.getProId());
                //stmt.setBoolean(15, candidato.isCanActivo());
                if (candidato.isCanActivo())
                    activo=1;
                else
                    activo=0;
                stmt.setInt(15, activo);
                stmt.executeUpdate();
                rs = stmt.getGeneratedKeys();
                if (rs.next()) {
                    id = rs.getInt(1);
                }
            }else{
                GestorFormacionExcepcion ex = new GestorFormacionExcepcion(rb.getString("existe-nif"));
                candidato=this.instanciarCandidato(rs);
                ex.setObjetoExcepcion(candidato);
                throw ex;
            }
            sql.close();
            stmt.close();

        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));

        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
        return id;
    }
    /**
     * Elimina un candidato de la base de datos, incluyendo los datos relacionados en la tabla CanConv.
     * @author Iratxe-Jon
     * @param canId: Identificador del candidato.
     * @param conId: Identificador de la convocatoria
     */
    public void eliminarCandidato(int canId, int conId) throws GestorFormacionExcepcion {
        Connection con = null;
        PreparedStatement sql =null;
        PreparedStatement stmt = null;
        ResultSet rs = null;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            con.setAutoCommit(false);

            //BORRAMOS SMSEnvios
            stmt = con.prepareStatement("DELETE FROM SMSEnvios WHERE IdCandidato=" + canId);
            stmt.executeUpdate();


            //BORRAMOS Los emails
            // Seleccionamos los correos del candidato
            sql = con.prepareStatement("SELECT CorId FROM CorreoCan WHERE CanId=" + canId);
            rs=sql.executeQuery();
            //eliminamos cada  mail de la tabla correo
            while(rs.next())
            {
                stmt = con.prepareStatement("DELETE FROM Correo WHERE CorId=" + rs.getInt("CorId"));
                stmt.executeUpdate();

            }
            sql.close();
            stmt = con.prepareStatement("DELETE FROM CorreoCan WHERE CanId=" + canId);
            stmt.executeUpdate();


            //Borramos los contactos
            sql = con.prepareStatement("SELECT ContId FROM Contacto WHERE CanId="+ canId);
            rs=sql.executeQuery();
            //eliminamos cada  mail de la tabla correo
            while(rs.next())
            {
                stmt = con.prepareStatement("DELETE FROM Contacto WHERE ContId=" + rs.getInt("ContId"));
                stmt.executeUpdate();

            }
            sql.close();

            //Borramos DocCand
            sql = con.prepareStatement("SELECT DocId FROM DocCand WHERE CanId="+ canId);
            rs=sql.executeQuery();
            //eliminamos cada  mail de la tabla correo
            while(rs.next())
            {
                stmt = con.prepareStatement("DELETE FROM DocCand WHERE DocId=" + rs.getInt("DocId"));
                stmt.executeUpdate();

            }
            sql.close();

            // Buscamos si el candidato está en más convocatorias
            sql = con.prepareStatement("SELECT ConId FROM CandConv WHERE canId=" + canId);
            rs = sql.executeQuery();

            while (rs.next()){
                conId = rs.getInt("ConId");
                //BORRAMOS la informacion del candidato en la convocatoria
                stmt = con.prepareStatement("DELETE FROM CandConv WHERE CanId=" + canId + " AND conId=" + conId);
                stmt.executeUpdate();
            }

            //BORRAMOS El candidato si no está en más convocatorias.
            stmt = con.prepareStatement("DELETE FROM Candidato WHERE CanId=" + canId);
            stmt.executeUpdate();

            con.commit();
            stmt.close();
            rs.close();
            sql.close();
        } catch (SQLException ex) {
            try {
                con.rollback();
            } catch (SQLException ex1) {
                 Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }
/*
     * Metodo que modifica los datos de un candidato.
     * @param candidato: Datos de un candidato.
     * @return Devuelve el identificador del candidato que hemos modificado.
     */
    public int modificarCandidato(Candidato candidato) throws GestorFormacionExcepcion {
        Connection con = null;
        SentenciaNula stmt = null;
        ResultSet rs = null;
        int activo=0;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement sql = con.prepareStatement("SELECT  CanNIF FROM Candidato WHERE UPPER(CanNIF)=? AND CanId<>?");
            sql.setString(1, candidato.getCanNif().toUpperCase());
            sql.setInt(2, candidato.getCanId());
            rs=sql.executeQuery();

            if(!rs.next()){
                stmt = new SentenciaNula(con, "UPDATE Candidato SET canTlf1=?, canTlf2=?, canMail=?, canDir=?, canLocalidad=?, canFechNac=?, canNom=?, canApe1=?,  canApe2=?, canObserv=?, CanActivo=?, EmpId=?, ProId=?, CanNss=?    WHERE canId=" + candidato.getCanId());
               
                stmt.setString(1, candidato.getCanTlf1());
                stmt.setString(2, candidato.getCanTlf2());
                stmt.setString(3, candidato.getCanMail().trim());
                stmt.setString(4, candidato.getCanDir());
                stmt.setString(5, candidato.getCanLocalidad());
                stmt.setTimestamp(6, candidato.getCanFechaNac());
                stmt.setString(7, candidato.getCanNom());
                stmt.setString(8, candidato.getCanApe1());
                stmt.setString(9, candidato.getCanApe2());
                stmt.setString(10, candidato.getCanObserv());
                if (candidato.isCanActivo())
                    activo=1;
                else
                    activo=0;
                stmt.setInt(11, activo);
                 stmt.setInt(12, candidato.getEmpId());
                stmt.setInt(13, candidato.getProId());
                stmt.setString(14, candidato.getCanNss());
                stmt.executeUpdate();
                stmt.close();


            }else{                 
                 throw new GestorFormacionExcepcion(rb.getString("existe-nif-modificar"));
            }
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }

        return candidato.getCanId();
    }
     /**
     * Metodo que visualiza los datos de un alumno en la base de datos.
     * Autor: Sara y Alvaro
     * @param idAlumno: Contiene el identficador del alumno.
     * @param idCurso: Contiene el identificador del curso
     * @return Devuelve un alumno.
     */
    public Candidato visualizarCandidato(int canId ,int conId) throws GestorFormacionExcepcion {
        Candidato candidato = new Candidato();
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT CanId, CanNIF, CanNSS, CanTlf1, CanTlf2, CanMail, CanDir, CanLocalidad, CanFechNac, CanNom, CanApe1, CanApe2, CanObserv, EmpId,ProId,CanActivo  FROM Candidato WHERE CanId=?");
                stmt.setInt(1, canId);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                candidato = instanciarCandidato(rs,conId);
            }
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return candidato;
    }
    /**
     * Elimina un candidato de la base de datos.
     * @author Fran - Eneko
     * @param canId: Identificador del candidato.
     */
    public Candidato getCandidato(int canId) throws GestorFormacionExcepcion {
        Candidato candidato = new Candidato();
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT CanId, CanNIF, CanNSS, CanTlf1, CanTlf2, CanMail, CanDir, CanLocalidad, CanFechNac, CanNom, CanApe1, CanApe2, CanObserv, EmpId,ProId,CanActivo  FROM Candidato WHERE CanId=?");
                stmt.setInt(1, canId);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                candidato = instanciarCandidato(rs);
            }
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return candidato;
    }

    
    /**
    * Metodo que crea un objeto candidato a partir de los resultados obtenidos de la consulta a la base de datos.
    * @author
    * @param rs: ResultSet obtenido de una consulta SQL.
    * @return Un Candidato
    */
    public Candidato instanciarCandidato(ResultSet rs) throws SQLException {
        Candidato candidato = new Candidato();


        candidato.setCanId(rs.getInt("CanId"));
        if (Verificador.validarDni(rs.getString("CanNIF"))) {
            candidato.setCanNif(rs.getString("CanNIF"));
        }
        if (Verificador.esNSS(rs.getString("CanNSS"))) {
            candidato.setCanNss(rs.getString("CanNSS"));
        }
        if (Verificador.comprobarTelefono(rs.getString("CanTlf1"))) {
            candidato.setCanTlf1(rs.getString("CanTlf1"));
        }
        if (Verificador.comprobarTelefono(rs.getString("CanTlf2"))) {
            candidato.setCanTlf2(rs.getString("CanTlf2"));
        }
        if (Verificador.esEmail(rs.getString("CanMail"))) {
            candidato.setCanMail(rs.getString("CanMail"));
        }
        candidato.setCanDir(rs.getString("CanDir"));
        candidato.setCanLocalidad(rs.getString("CanLocalidad"));
        candidato.setCanFechaNac(rs.getTimestamp("CanFechNac"));
        
        if (Verificador.caracteresCorrectos(rs.getString("CanNom"))) {
            candidato.setCanNom(rs.getString("CanNom"));
        }
        if (Verificador.caracteresCorrectos(rs.getString("CanApe1"))) {
            candidato.setCanApe1(rs.getString("CanApe1"));
        }
        if (Verificador.caracteresCorrectos(rs.getString("CanApe2"))) {
            candidato.setCanApe2(rs.getString("CanApe2"));
        }
        candidato.setCanObserv(rs.getString("CanObserv"));
        candidato.setEmpId(rs.getInt("EmpId"));
        candidato.setProId(rs.getInt("ProId"));
        candidato.setCanActivo(rs.getBoolean("CanActivo"));

        return candidato;
    }

    /**
     * Metodo qur crea un objeto candidato a partir de los resultados obtenidos de la consulta a la base de datos.
     * @author
     * @param rs: ResultSet obtenido de una consulta SQL.
     * @param conId: Identificador de la convocatoria.
     * @return Un candidato
     */
    public Candidato instanciarCandidato(ResultSet rs, int conId) throws SQLException, GestorFormacionExcepcion {
        Candidato candidato = new Candidato();
        DAOFactory factoria = DAOFactory.getDAOFactory(DAOFactory.SQLSERVER);
        IEstadoDAO estadoDAO= factoria.getIEstadoDAO();
        ICandConvDAO candConvDAO = factoria.getICandConvDAO();

        candidato.setCanId(rs.getInt("CanId"));
        if (Verificador.validarDni(rs.getString("CanNIF"))) {
            candidato.setCanNif(rs.getString("CanNIF"));
        }
        if (Verificador.esNSS(rs.getString("CanNSS"))) {
            candidato.setCanNss(rs.getString("CanNSS"));
        }
        if (Verificador.comprobarTelefono(rs.getString("CanTlf1"))) {
            candidato.setCanTlf1(rs.getString("CanTlf1"));
        }
        if (Verificador.comprobarTelefono(rs.getString("CanTlf2"))) {
            candidato.setCanTlf2(rs.getString("CanTlf2"));
        }
        if (Verificador.esEmail(rs.getString("CanMail"))) {
            candidato.setCanMail(rs.getString("CanMail"));
        }
        candidato.setCanDir(rs.getString("CanDir"));
        candidato.setCanLocalidad(rs.getString("CanLocalidad"));
        
        candidato.setCanFechaNac(rs.getTimestamp("CanFechNac"));
        
        if (Verificador.caracteresCorrectos(rs.getString("CanNom"))) {
            candidato.setCanNom(rs.getString("CanNom"));
        }
        if (Verificador.caracteresCorrectos(rs.getString("CanApe1"))) {
            candidato.setCanApe1(rs.getString("CanApe1"));
        }
        if (Verificador.caracteresCorrectos(rs.getString("CanApe2"))) {
            candidato.setCanApe2(rs.getString("CanApe2"));
        }
        candidato.setCanObserv(rs.getString("CanObserv"));
        candidato.setEmpId(rs.getInt("EmpId"));
        candidato.setProId(rs.getInt("ProId"));
        candidato.setCanActivo(rs.getBoolean("CanActivo"));
        //  incluir el estado del candidato
        if (conId != -1) {
            candidato.setConId(conId);
            try {
    //            candidato.setEstado(estadoDAO.visualizarEstado(rs.getInt("EstId")));
                candidato.setCandConv(candConvDAO.buscarCandConv(rs.getInt("CanId"), conId));
                candidato.setEstado(estadoDAO.visualizarEstado(candidato.getCandConv().getEstId()));

            } catch (GestorFormacionExcepcion ex) {
                 Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
        }
           
        
        
        return candidato;
    }
    /**
     *
     * Clase que devuelve la lista de candidatos. La SQL nos la devuelve el fitro.
     * @param filtro
     * @return
     * @throws GestorFormacionExcepcion
     */
    public ArrayList<Candidato> listarCandidatos(FiltroCandidato filtro) throws GestorFormacionExcepcion{
        ArrayList<Candidato> candidatos = new ArrayList<Candidato>();
        Candidato candidato;
        Connection conexion = null;
        String sql = null;
        int posicion=0;

        sql = filtro.getSQL();
 
        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql,
                                                    ResultSet.TYPE_SCROLL_SENSITIVE,
                                                    ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = stmt.executeQuery();
     
            //while (rs.next()) {

            if (filtro.getPrimerElemento()>0)
                {
                    rs.absolute(filtro.getPrimerElemento()-1);
                }
            for( int i=filtro.getPrimerElemento()-1;i<filtro.getUltimoElemento();i++)
            {
     
                if (rs.next())
                {        
                    if(filtro.isNoConvocatoria()){
                        if((rs.getRow()>=filtro.getPrimerElemento()&& rs.getRow()<=filtro.getUltimoElemento())){
                        candidato = instanciarCandidato(rs);
                        candidatos.add(candidato);
                        }
                    }else{
                        candidato = instanciarCandidato(rs, filtro.getConvId());
                        candidatos.add(candidato);
                    }
                }

            }
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return candidatos;
    }
/**
     * Metodo que cuenta el número de candidatos devueltos al aplicar el filtro establecido.
     * @param filtro: Contiene los datos de filtrado del candidato.
     * @return Devuelve el número de registros obtenidos.
     */
    public int contarCandidatos(FiltroCandidato filtro) throws GestorFormacionExcepcion {
        int registros = 0;
        Connection conexion = null;
        String sql = filtro.getSQL();

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = stmt.executeQuery();

            if (rs.last()) {
                registros = rs.getRow();
            }
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return registros;
    }

    /**
     * Metodo que comprueba si existe algun candidato con un determinado NIF.
     * @param filtro: Contiene los datos de filtrado del candidato.
     * @return Devuelve si existe o si no, en un boolean.
     */
     public boolean existecandidato(String nif) throws GestorFormacionExcepcion {
        boolean existe = false;
        Connection conexion = null;

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement("SELECT CanNIF FROM Candidato WHERE CanNIF = ?");
            stmt.setString(1, nif);
            ResultSet rs = stmt.executeQuery();
            if (rs.next()) {
                existe = true;
            }
            rs.close();
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return existe;
    }
    /**
     * Elimina un candidato de la base de datos, incluyendo los datos relacionados en la tabla CanConv.
     * @author Erik - Eneko
     * @param filtro: identificador del filtro de candidatos
     */
    public ArrayList<Candidato> mostrarCandidatos(FiltroCandidato filtro) throws GestorFormacionExcepcion {
        ArrayList<Candidato> candidatos = new ArrayList<Candidato>();
        Candidato candidato;
        Connection conexion = null;
        String sql = null;
        int posicion=0;

        sql = filtro.getSQL();

        try {
            conexion = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            PreparedStatement stmt = conexion.prepareStatement(sql,
                                                    ResultSet.TYPE_SCROLL_SENSITIVE,
                                                    ResultSet.CONCUR_UPDATABLE);
            ResultSet rs = stmt.executeQuery();

            //while (rs.next()) {

            if (filtro.getPrimerElemento()>0)
                {
                    rs.absolute(filtro.getPrimerElemento()-1);
                }
            for( int i=filtro.getPrimerElemento()-1;i<filtro.getUltimoElemento();i++)
            {

                if (rs.next())
                {
                    if((rs.getRow()>=filtro.getPrimerElemento()&& rs.getRow()<=filtro.getUltimoElemento())){
                        candidato = instanciarCandidato(rs);
                        candidatos.add(candidato);
                    }
                }

            }
            stmt.close();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(conexion);
        }

        return candidatos;
    }
    /**
     * Elimina un candidato de la base de datos.
     * @author Erik - Eneko
     * @param canId: Identificador del candidato.
     */
    public void eliminarNuevoCandidato(int canId) throws GestorFormacionExcepcion {
        Connection con = null;
        PreparedStatement sql =null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        int idCon = -1;

        try {
            con = SQLServerDAOFactory.conecta();
        } catch (SQLException ex) {
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-conexion"));
        }

        try {
            con.setAutoCommit(false);

            //BORRAMOS SMSEnvios
            stmt = con.prepareStatement("DELETE FROM SMSEnvios WHERE IdCandidato=" + canId);
            stmt.executeUpdate();


            //BORRAMOS Los emails
            // Seleccionamos los correos del candidato
            sql = con.prepareStatement("SELECT CorId FROM CorreoCan WHERE CanId=" + canId);
            rs=sql.executeQuery();
            //eliminamos cada  mail de la tabla correo
            while(rs.next())
            {
                stmt = con.prepareStatement("DELETE FROM Correo WHERE CorId=" + rs.getInt("CorId"));
                stmt.executeUpdate();

            }
            sql.close();
            stmt = con.prepareStatement("DELETE FROM CorreoCan WHERE CanId=" + canId);
            stmt.executeUpdate();


            //Borramos los contactos
            sql = con.prepareStatement("SELECT ContId FROM Contacto WHERE CanId="+ canId);
            rs=sql.executeQuery();
            //eliminamos cada  mail de la tabla correo
            while(rs.next())
            {
                stmt = con.prepareStatement("DELETE FROM Contacto WHERE ContId=" + rs.getInt("ContId"));
                stmt.executeUpdate();

            }
            sql.close();

            //Borramos DocCand
            sql = con.prepareStatement("SELECT DocId FROM DocCand WHERE CanId="+ canId);
            rs=sql.executeQuery();
            //eliminamos cada  mail de la tabla correo
            while(rs.next())
            {
                stmt = con.prepareStatement("DELETE FROM DocCand WHERE DocId=" + rs.getInt("DocId"));
                stmt.executeUpdate();

            }
            sql.close();

            // Buscamos si el candidato está en más convocatorias
            sql = con.prepareStatement("SELECT ConId FROM CandConv WHERE canId=" + canId);
            rs = sql.executeQuery();
            sql = con.prepareStatement("SELECT ConId FROM CandConv WHERE canId=" + canId);
            rs = sql.executeQuery();

            while (rs.next()){
                idCon = rs.getInt("ConId");
                //BORRAMOS la informacion del candidato en la convocatoria
                stmt = con.prepareStatement("DELETE FROM CandConv WHERE CanId=" + canId + " AND conId=" + idCon);
                stmt.executeUpdate();
            }
            //BORRAMOS El candidato si no está en más convocatorias.
            stmt = con.prepareStatement("DELETE FROM Candidato WHERE CanId=" + canId);
            stmt.executeUpdate();

            con.commit();
            stmt.close();
            rs.close();
            sql.close();
        } catch (SQLException ex) {
            try {
                con.rollback();
            } catch (SQLException ex1) {
                 Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
                throw new GestorFormacionExcepcion(rb.getString("no-sql"));
            }
             Logger.getLogger(SQLServerCandidatoDAO.class.getName()).log(Level.SEVERE, null, ex);
            throw new GestorFormacionExcepcion(rb.getString("no-sql"));
        } finally {
            SQLServerDAOFactory.desconecta(con);
        }
    }  
}
